#ifndef SCENEOBJECT_H_
#define SCENEOBJECT_H_
#include <SDL/SDL.h>
#include "Utils.h"
#include "BaseRenderObject.h"
#include "math/Matrix3.h"
#include "RawObjectData.h"
#include "CollisionHul.h"
#include "SceneNode.h"


#define CHECK_OPENGL_ERROR( ) \
		GLenum error;\
		while ( (error = glGetError() ) != GL_NO_ERROR ) {\
		cout <<"failed with error:"<< gluErrorString(error)<<endl; \



/*
*	___ SCENEOBJECT Header___
*
*
***************************************************************/

class SceneObject : public SceneNode, public CollisionHul
{
	private:
		RawObjectData*				_objData;
		Matrix3*		 			_mat;
		list<TrianglePlane*>*		_collPlanes;
		map<VertexData*,Vector3*>	_collPoints;
		int selectedMesh;
		int selectedTri;
		TriangleData* _selectedTriData;


		// entscheidet darüber ob es ein objekt ist das auf der
		// welt plaziert ist und durch die camera bewegt werden kann ( dann auf true setzen)
		// oder es eine lokales objekt ist, d.h. es befindet sich ständig im camera punkt.
		bool _worldObject;

		void TransformObject();
		void fillCollisionPlanes();
		void DrawSelection();
	protected:
		virtual void DrawObject();
		virtual void DrawObject( unsigned int meshIndex );
	public:

		SceneObject( );
		SceneObject( RawObjectData *objData  );
		virtual ~SceneObject( );

		void SelectNextTriangle();
		void SelectPreviousTriangle();

		list<TrianglePlane*>* getTrianglePlaneList();
		bool isWorldObject();
		void setWorldObject( bool wo );
		Matrix3 getMatrix() const;
		void setMatrix(const Matrix3& mat);
		void setTransformation( const Matrix3& mat );
		RawObjectData* getRawData();
		long getPolygonNum ();

		void RenderObject();

};


/***************************************************************/
#endif
